import fs from 'fs';
import path from 'path';

/**
 * 简单的Opus帧分析工具
 * 用于分析Buffer数据是否是合法的Opus帧
 */

function analyzeOpusFrame(buffer) {
    console.log('=== Opus帧数据分析 ===');
    console.log(`Buffer长度: ${buffer.length} 字节`);
    console.log(`Buffer内容: ${buffer.toString('hex')}`);
    
    // 检查是否是Opus文件头
    if (buffer.length >= 8) {
        const header = String.fromCharCode(...buffer.slice(0, 8));
        if (header === "OpusHead") {
            console.log('✅ 这是Opus文件头');
            return;
        }
    }
    
    // 检查是否是OGG容器
    if (buffer.length >= 4) {
        const oggHeader = String.fromCharCode(...buffer.slice(0, 4));
        if (oggHeader === "OggS") {
            console.log('✅ 这是OGG容器格式');
            return;
        }
    }
    
    // 分析裸Opus帧数据
    if (buffer.length < 1) {
        console.log('❌ 数据太短，不是有效的Opus帧');
        return;
    }
    
    // 解析TOC字节
    const toc = buffer[0];
    const config = (toc >> 3) & 0x1F;
    const stereo = (toc >> 2) & 0x01;
    const frameType = toc & 0x03;
    
    console.log(`TOC字节: 0x${toc.toString(16).padStart(2, '0')}`);
    console.log(`配置: ${config}`);
    console.log(`立体声: ${stereo ? '是' : '否'}`);
    console.log(`帧类型: ${frameType}`);
    
    // 检查数据有效性
    const validRange = Array.from(buffer).every(b => b >= 0 && b <= 255);
    
    if (validRange) {
        console.log('✅ 这可能是合法的Opus帧数据');
        console.log(`- 长度: ${buffer.length} 字节`);
        console.log(`- 编码配置: ${config}`);
        console.log(`- 声道: ${stereo ? '立体声' : '单声道'}`);
        console.log(`- 帧类型: ${frameType === 0 ? '单帧' : frameType === 1 ? '2.5ms' : frameType === 2 ? '5ms' : '10ms/20ms/40ms/60ms'}`);
    } else {
        console.log('❌ 数据范围异常，不是有效的Opus帧');
    }
}

// 从output_frames目录读取并分析文件
async function analyzeFramesFromDirectory() {
    const framesDir = './output_frames';
    
    try {
        // 检查目录是否存在
        if (!fs.existsSync(framesDir)) {
            console.log(`❌ 目录 ${framesDir} 不存在`);
            return;
        }
        
        // 读取目录中的所有文件
        const files = fs.readdirSync(framesDir);
        const opusFiles = files.filter(file => file.endsWith('.opus'));
        
        if (opusFiles.length === 0) {
            console.log(`❌ 在 ${framesDir} 目录中没有找到.opus文件`);
            return;
        }
        
        console.log(`📁 在 ${framesDir} 目录中找到 ${opusFiles.length} 个Opus文件:`);
        opusFiles.forEach(file => console.log(`  - ${file}`));
        console.log('');
        
        // 分析每个文件
        for (const file of opusFiles) {
            const filePath = path.join(framesDir, file);
            console.log(`🔍 分析文件: ${file}`);
            console.log('─'.repeat(50));
            
            try {
                const buffer = fs.readFileSync(filePath);
                analyzeOpusFrame(buffer);
            } catch (error) {
                console.log(`❌ 读取文件 ${file} 失败:`, error.message);
            }
            
            console.log('');
        }
        
    } catch (error) {
        console.log('❌ 读取目录失败:', error.message);
    }
}

// 主函数
async function main() {
    // 检查命令行参数
    const args = process.argv.slice(2);
    
    if (args.length > 0) {
        // 如果提供了文件路径，分析指定文件
        const filePath = args[0];
        try {
            const buffer = fs.readFileSync(filePath);
            analyzeOpusFrame(buffer);
        } catch (error) {
            console.log(`❌ 读取文件失败: ${error.message}`);
        }
    } else {
        // 否则分析output_frames目录中的所有文件
        await analyzeFramesFromDirectory();
    }
}

// 运行主函数
main().catch(console.error);

export { analyzeOpusFrame };
